#pragma once
#include <windows.h>  
#include "opencv.hpp"
#include "SSE.h"


class stop_watch
{
public:
	stop_watch()
		: elapsed_(0)
	{
		QueryPerformanceFrequency(&freq_);
	}
	~stop_watch() {}
public:
	void start()
	{
		QueryPerformanceCounter(&begin_time_);
	}
	void stop()
	{
		LARGE_INTEGER end_time;
		QueryPerformanceCounter(&end_time);
		elapsed_ += (end_time.QuadPart - begin_time_.QuadPart) * 1000000 / freq_.QuadPart;
	}
	void restart()
	{
		elapsed_ = 0;
		start();
	}
	//微秒
	double elapsed()
	{
		return static_cast<double>(elapsed_);
	}
	//毫秒
	double elapsed_ms()
	{
		return elapsed_ / 1000.0;
	}
	//秒
	double elapsed_second()
	{
		return elapsed_ / 1000000.0;
	}

private:
	LARGE_INTEGER freq_;
	LARGE_INTEGER begin_time_;
	long long elapsed_;
};


void DericheSpeed(cv::Mat& img, cv::Mat* outimg, double aph);
void Sauvola(cv::Mat& img, cv::Mat* outimg, double k, int windowSize);
void TotalVariationDenoising(cv::Mat& img, cv::Mat* outimg, float Lamda = 20, int Iter = 20);
void zhang(cv::Mat input, cv::Mat* outimg);
int Euclidean(cv::Mat& InImg, cv::Mat& OutImg);
void FillHole(cv::Mat& img, bool FillBackGround = false);
void FillHoles(cv::Mat& img, cv::Mat* outimg);
void SurfaceBlur(cv::Mat& img, cv::Mat* outimg, int Radius, int Threshold);
void Threshoud(cv::Mat& img, int MinValue, int MaxValue, cv::Mat* outimg);
void AveragingThreshoud(cv::Mat& img, short threshoud, uchar value, int neighborhood, cv::Mat* outimg);

void SobelXY(cv::Mat& img, cv::Mat* Dxy);
void SobelXY(cv::Mat& img, cv::Mat* Dx, cv::Mat* Dy);
void ContourAnchor(cv::Mat& img, cv::Mat* Dis, uchar threshold);
void NMSuppression(cv::Mat& img, cv::Mat& srcX, cv::Mat& srcY, cv::Mat* Dis, cv::Mat* flg, uchar thresholdMin, uchar thresholdMax);
void Filter2d(cv::Mat& src, cv::Mat& Kernel, cv::Mat* dstX, cv::Mat* dstY);
void Filter2d16(cv::Mat& src, cv::Mat& Kernel, cv::Mat* dstX, cv::Mat* dstY);
void GenDistance(cv::Mat& srcA, cv::Mat& srcB, cv::Mat* dst);
void EdgeSubpix(cv::Mat& img, double ThreadMin, double ThreadMax, std::vector<std::vector<cv::Point2f>>& RList, double sigma);


//求图像关联 卷积
uint64 CorrelationAVX2(cv::Mat& imgA, cv::Mat& imgB);
uint64 CorrelationSSE(cv::Mat& imgA, cv::Mat& imgB);

//求图像和、平方和
void ValueSum(cv::Mat& img, uint64& ResVal);
void SquareSum(cv::Mat& img, uint64& ResVal);
void ValueSquareSum(cv::Mat& img, uint64& ValueVal, uint64& SquareVal);

void DirectFitEllipse(std::vector<cv::Point2f>& PointList, cv::RotatedRect* Ellipse);

//tool
__forceinline bool GetValt(cv::Mat& img, cv::Mat* outimg, cv::Mat& Outimage)
{
	bool needNew = img.data == outimg->data || img.size != outimg->size || img.type() != outimg->type();
	if (needNew)
	{
		Outimage = cv::Mat(img.size(), CV_8UC1);
	}
	else
	{
		Outimage = *outimg;
	}
	return needNew;
}




